from django.http import HttpResponse
from django.shortcuts import render
from book.models import BookInfo
# Create your views here.
def index(request):
    #在这里实现增删改查
    return HttpResponse('index')

def create_book(request):
    book=BookInfo.object.create(
        name='abc',
        pub_date='2000-1-1',
        readcounr=10
    )
    return HttpResponse("create")

#####################################
"""
查询字符串
http://ip:port/path/path/?key=value&key1=value1
url 以 ？ 为分割 分为2部分
？前面为 请求路径
？后面为 查询字符串（类似于字典 key=value 多个数据采集用&拼接）
"""
def shop(request,city_id,shop_id):
    #print(city_id, shop_id)
    query_params=request.GET #查询该键对应的单个值用GET('键',默认值)
    print(query_params) #打印结果:<QueryDict: {'order': ['readcount']}>
    #QueryDict 具有字典的特征,同时可以一键多值
    order=query_params.getlist('order')
    #查询该键对应的单个值用GET('键',默认值)
    #查询该键对应的多个值用getlist('键',默认值)
    print(order)
    return HttpResponse('hello')

def register(request):
    data=request.POST
    print(data)
    return HttpResponse('OK')

def json(request):
    body=request.body#json数据不能通过request.POST获取数据
    print(body)
    print(type(body))
    body_str=body.decode()#将结果转为字符串类型
    print(type(body_str))
    return HttpResponse('json')

from django.http import HttpResponse,JsonResponse
def response(request):
    #JSON和pyhton中的字典可以相互转换
    info={
        'name':'itcast',
        'address':'shunyi'
    }
    firends=[
        {
            'name':'rose',
            'address':'shunyi'
        },
        {
            'name':'jack',
            'address':'changping'
        }
    ]
    response=JsonResponse(data=firends,safe=False)
    # safe = True 是表示我们的data是字典数据
    # JsonResponse 可以把字典转换为json
    return response
"""
############ 增加数据 #####################
from book.models import BookInfo
#方式1
book=BookInfo(
    name='Django',
    pub_date='2000-1-1',
    readcount=10
)
# 1.必须要调用 对象的save方法才能将数据保存到数据库中，
# 要不然数据只保存在内存中
# 2.必须在模型迁移建表之后执行，否则报错
book.save()

#方式2
#objects -- 相当于一个代理，实现增删改查
BookInfo.objects.create(
    name='yw',
    pub_date='2020-1-1',
    readcount=200
)

from book.models import PeopleInfo
PeopleInfo.objects.create(
    name='张三',
    gender=1,
    description='善良',
    book_id=2
)






#################修改数据############
# 方式1
book=BookInfo.objects.get(id=2)
book.name='cs'
#必须要调用对象的save方法才能将数据保存到数据库中
book.save()
# 方式2
#filter   中文为过滤的意思
BookInfo.objects.filter(id=2).update(name='ceshi',commentcount=666)

##################删除数据##################
# 方式1
book=BookInfo.objects.get(id=2)
#删除分为物理删除（这条记录的数据删除）和逻辑删除（修改标记位 例如 is_delete=False)
book.delete()
# 方式2
BookInfo.objects.get(id=2).delete()
BookInfo.objects.filter(id=2).delete()


#######################################
#get查询当一结果，如果不存在会抛出模型类，DoesNotExist异常
try:
    book=BookInfo.objects.get(id=1)
    print('查询成功：', book.name)
except BookInfo.DoesNotExist:
    print('查询结果不存在')
#all 查询多个结果
BookInfo.objects.all()
from book.models import PeopleInfo
PeopleInfo.objects.all()
# count查询结果数量
BookInfo.objects.all().count()
BookInfo.objects.count()

##############过滤查询#################
# filter 过滤出多个结果,输出的结果为列表
# exclude 排除掉符合条件剩下的结果(不等于)
# get 过滤单一结果
# 模型类名.objcts.filter(属性名__运算符=值)     获取n个结果 n=0，1，1...
# 模型类名.objcts.exclude(属性名__运算符=值)    获取n个结果 n=0，1，1...
# 模型类名.objcts.get(属性名__运算符=值)        获取1个结果
book=BookInfo.objects.get(id=1)   #简写(属性名=值)
book=BookInfo.objects.get(id__exact=1) #(属性名__运算符=值)
book=BookInfo.objects.get(pk=1)  #pk:primary key 主键

# 运算符
# >    gt      (great)
# >=   gte     (great equal)
# <    lt      (litte)
# <=   lte     (litte equal)
# exact 用于精确匹配
# contains 包含

######################################
from django.db.models import F
#F对象：用于2个属性的比较
#语法形式：以filter为例   模型类名.objects.filter(属性名__运算符=F('第二个属性名'))

# 例：查询阅读量大于等于评论量的图书
BookInfo.objects.filter(readcount__gte=F('commentcount'))

#####################################
# 并且查询
# 例：查询阅读量大于20，并且编号小于3的图书
BookInfo.objects.filter(readcount__gt=20).filter(id__lt=3)
BookInfo.objects.filter(readcount__gt=20,id__lt=3)

####################################3
from django.db.models import Q
#Q对象：并且查询，或者查询
#或者语法： 模类名型.objects.filter(Q(属性名__运算符=值)|Q(属性名__运算符=值)|...)
#并且语法： 模类名型.objects.filter(Q(属性名__运算符=值)&Q(属性名__运算符=值)&...)
#not 非 语法:模类名型.objects.filter(~Q(属性名__运算符=值))

# 例：查询阅读量大于20，或者编号小于3的图书
BookInfo.objects.filter(Q(readcount__gt=20)|Q(id__lt=3))


##################管理查询#######################
#查询书籍为1的所有人物信息(BookInfo为被关联的表）
book=BookInfo.objects.get(id=1)#获取id为1的书籍
book.peopleinfo_set.all()

#PeopleInfo.objects.fillter(book=1)

#查询人物为1的书籍信息
person=PeopleInfo.objects.get(id=1)
book1=person.book
# 会调用 BookInfo 的 __str__ 方法，默认显示 name（如果你定义了该书籍的所有信息的话,显示该书籍的所有信息）

person.book.readcount



#############关联过滤查询#####################
#语法形式： 模型类名.objects.filter(关联模型类名小写__字段名__运算符=值)
#例题：
# 1.查询图书，要求图书人物为“张三”
BookInfo.objects.filter(peopleinfo__name__exact='张三')
# 2.查询图书，要求图书人物中的描述包含“仔”
BookInfo.objects.filter(peopleinfo__description__contains='细')
"""

#################### Cookie #######################
'''
第一次请求携带 查询字符串 
# http://127.0.0.1:8000/set_cookie/?username=itcase&password=123
服务器接收请求之后，获取username，服务器设置cookie信息，cookie信息包括 username
浏览器接收到服务器响应之后，应该把cookie保存起来

第二次及之后的请求，我们访问 http://127.0.0.1:8000 都会携带cookie信息。
服务器就可以读取cookie信息，来判断用户身份，进行权限验证
'''
def set_cookie(request):
    # 1.获取查询字符串数据
    username=request.GET.get("username")
    # 2.服务器设置cookie信息
    # 通过响应对象(response).set_cookie方法
    response=HttpResponse('set_cookie')
    # key,value=''
    response.set_cookie('name',username)
    return response
def get_cookie(request):
    print(request.COOKIES)
    # request.COOKIES 字典数据
    name=request.COOKIES.get('name')
    return HttpResponse('get_cookie')

################# Session ####################
# session 是保存在服务器 -- 数据相对安全
# session 需要依赖于cookie
'''
第一次请求 http://127.0.0.1:8000/set_session/?username=itcase
我们在服务器端设置session信息的同时，服务器同时会生成一个sessionid的cookie信息。
浏览器接收到这个信息之后，会把cookie数据保存起来

第二次及之后的请求都会携带这个sessionid，
服务器会验证这个sessionid，验证没有问题会读取相关数据
'''
def set_session(request):
    username=request.GET.get('username')
    #设置session信息
    #(假设我们通过 模型查询 查询到了用户信息)
    user_id = 1
    request.session['user_id']=user_id
    request.session['username']=username
    return HttpResponse("set_session")

def get_session(request):
    user_id=request.session.get('user_id')
    username=request.session.get('username')
    content='{},{}'.format(user_id,username)
    return HttpResponse(content)


'''
1.继承自View    
2.类视图中的方法 是采用http方法小写来区分不同的请求方式
'''
from django.views import View
class LoginView(View):
    def get(self,request):
        return HttpResponse('get get get')
    def post(selfself,request):
        return HttpResponse('post post post')